library(tidyverse)
library(dplyr)
# install.packages("skimr")
library(skimr)
# install.packages("janitor")
library(janitor)
# install.packages("ggcorrplot")
library(ggcorrplot)
# load clean file
life_clean <- read.csv("../data/new/data.csv")

glimpse(life_clean)
Rows: 20,000
Columns: 38
$ age                           <dbl> 34.91, 23.37, 33.20, 38.69, 45.09, 53.19, 23.17, 55.92, 24.11, 39.19, 50.51, 47.77, 19.00, 38.01, 27.39, 18.86, 40.36, 37.14, 18.93, 46.00, 37.06, 50.23, 30.90…
$ gender                        <int> 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, …
$ weight                        <dbl> 65.27, 56.41, 58.98, 93.78, 52.42, 105.05, 58.41, 84.07, 88.58, 50.32, 86.37, 83.89, 82.66, 57.67, 71.79, 95.12, 56.88, 76.48, 72.56, 60.05, 73.04, 86.72, 76.7…
$ height                        <dbl> 1.62, 1.55, 1.67, 1.70, 1.88, 1.84, 1.78, 1.63, 1.79, 1.60, 1.63, 1.82, 1.96, 1.56, 1.97, 1.85, 1.71, 1.77, 1.79, 1.68, 1.74, 1.63, 1.71, 1.79, 1.91, 1.76, 1.8…
$ max_bpm                       <dbl> 188.58, 179.43, 175.04, 191.21, 193.58, 176.52, 184.75, 183.87, 176.78, 166.88, 160.92, 176.36, 173.75, 184.91, 180.96, 189.48, 168.02, 180.29, 177.48, 164.91,…
$ avg_bpm                       <dbl> 157.65, 131.75, 123.95, 155.10, 152.88, 130.60, 140.90, 141.12, 154.07, 128.04, 143.20, 148.74, 168.71, 132.43, 151.11, 142.51, 142.67, 127.80, 124.41, 147.10,…
$ resting_bpm                   <dbl> 69.05, 73.18, 54.96, 50.07, 70.84, 61.84, 58.01, 51.79, 65.19, 49.91, 57.87, 69.91, 62.16, 54.04, 72.68, 49.90, 60.89, 56.76, 60.95, 62.34, 65.11, 58.08, 51.88…
$ session_duration              <dbl> 1.00, 1.37, 0.91, 1.10, 1.08, 0.69, 1.67, 1.01, 1.76, 1.17, 1.69, 1.91, 1.89, 1.64, 0.75, 1.20, 1.87, 1.36, 0.81, 1.17, 1.04, 1.70, 1.27, 1.76, 1.09, 1.48, 1.3…
$ calories_burned               <dbl> 1080.90, 1809.91, 802.26, 1450.79, 1166.40, 453.33, 1953.90, 727.81, 2062.37, 1157.25, 1974.26, 2733.40, 2700.62, 2345.20, 743.85, 1293.84, 2189.58, 1305.60, 8…
$ workout_type                  <int> 0, 1, 2, 1, 0, 3, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 0, 1, 0, 3, 2, 2, 0, 3, 2, 2, 1, 0, 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, 3, 1, 1, 3, 3, 1, 1, 2, 3, 0, 3, 2, 1, …
$ fat_percentage                <dbl> 26.80038, 27.65502, 24.32082, 32.81357, 17.30732, 32.04906, 20.54629, 32.08818, 27.36725, 21.90938, 29.07153, 23.64932, 24.12879, 26.59443, 24.47776, 28.04993,…
$ water_intake                  <dbl> 1.50, 1.90, 1.88, 2.50, 2.91, 2.91, 2.71, 2.88, 3.49, 2.49, 3.49, 3.51, 3.50, 2.71, 3.59, 2.30, 2.69, 2.09, 1.58, 2.51, 2.39, 3.51, 1.82, 3.48, 2.72, 3.39, 2.2…
$ workout_frequency             <dbl> 3.99, 4.00, 2.99, 3.99, 4.00, 3.02, 4.96, 3.97, 4.01, 2.00, 4.01, 5.02, 5.02, 5.00, 3.01, 4.00, 5.02, 4.00, 2.99, 4.01, 3.00, 4.00, 3.98, 4.01, 3.99, 3.00, 2.9…
$ experience_level              <dbl> 2.01, 2.01, 1.02, 1.99, 2.00, 1.00, 3.00, 2.01, 3.02, 1.00, 2.98, 3.01, 2.99, 3.00, 1.02, 1.98, 3.01, 2.00, 1.02, 2.00, 2.00, 3.00, 1.95, 3.01, 2.00, 2.02, 2.0…
$ bmi                           <dbl> 24.87, 23.48, 21.15, 32.45, 14.83, 31.03, 18.44, 31.64, 27.65, 19.66, 32.51, 25.33, 21.52, 23.70, 18.50, 27.79, 19.45, 24.41, 22.65, 21.28, 24.12, 32.64, 26.25…
$ daily_meals_frequency         <dbl> 2.99, 3.01, 1.99, 3.00, 3.00, 2.99, 2.02, 2.99, 3.00, 3.01, 3.00, 3.01, 3.01, 3.98, 3.01, 2.00, 1.98, 2.99, 2.99, 1.99, 3.02, 3.00, 2.00, 2.99, 2.01, 3.00, 4.0…
$ physical_exercise             <dbl> 0.01, 0.97, -0.02, 0.04, 3.00, -0.04, -0.03, 0.00, 0.02, 0.02, 0.02, 0.01, 0.01, 2.99, 0.02, 0.96, 0.01, -0.02, 0.02, 0.01, 1.00, -0.01, 1.01, -0.01, 0.00, 0.0…
$ carbs                         <dbl> 267.68, 214.32, 246.04, 203.22, 332.79, 170.86, 280.33, 262.57, 173.08, 191.06, 258.98, 231.16, 181.82, 369.71, 207.16, 298.25, 192.66, 233.62, 219.75, 247.96,…
$ proteins                      <dbl> 106.05, 85.41, 98.11, 80.84, 133.05, 67.92, 112.35, 105.41, 69.44, 76.76, 102.72, 93.27, 71.60, 147.77, 82.59, 118.86, 76.80, 92.99, 87.27, 99.40, 120.63, 103.…
$ fats                          <dbl> 71.63, 56.97, 65.48, 54.56, 88.43, 46.06, 74.97, 70.37, 45.91, 50.71, 68.72, 61.23, 48.11, 98.38, 55.08, 79.54, 51.19, 62.41, 58.09, 66.24, 80.22, 68.88, 58.85…
$ calories                      <int> 1806, 1577, 1608, 2657, 1470, 2767, 1867, 2191, 2587, 1247, 2476, 2232, 2569, 1726, 2046, 2455, 1740, 2166, 1802, 1716, 2038, 2212, 2182, 2410, 1510, 2269, 301…
$ diet_type                     <int> 0, 1, 2, 2, 0, 3, 4, 4, 0, 2, 3, 3, 0, 4, 4, 2, 2, 4, 1, 1, 0, 5, 2, 3, 3, 3, 5, 0, 2, 4, 1, 2, 3, 2, 5, 3, 4, 4, 2, 0, 3, 2, 2, 1, 5, 5, 2, 2, 5, 1, 2, 1, 0, …
$ sugar_g                       <dbl> 31.77, 12.34, 42.81, 9.34, 23.78, 15.89, 12.48, 2.87, 0.72, 50.02, 10.00, 11.88, 30.30, 35.84, 16.18, 25.56, 43.14, 27.80, 5.03, 16.21, 1.96, 10.70, 15.41, 0.8…
$ sodium_mg                     <dbl> 1729.94, 693.08, 2142.48, 123.20, 1935.11, 2382.39, 2220.46, 1501.99, 293.36, 757.93, 1356.53, 323.04, 80.98, 131.07, 674.45, 835.15, 58.47, 434.36, 1193.73, 1…
$ cholesterol_mg                <dbl> 285.05, 300.61, 215.42, 9.70, 116.89, 36.38, 56.69, 74.70, 188.26, 291.34, 170.61, 135.18, 210.51, 244.36, 127.06, 299.07, 291.50, 271.65, 252.47, 53.39, 21.79…
$ sets                          <dbl> 4.99, 4.01, 5.00, 4.01, 4.99, 4.00, 5.01, 4.97, 3.99, 4.02, 4.99, 4.00, 3.99, 4.99, 4.00, 4.99, 5.00, 5.00, 4.00, 4.00, 4.98, 5.00, 4.00, 3.99, 4.01, 5.00, 3.9…
$ reps                          <dbl> 20.91, 16.15, 21.90, 16.92, 15.01, 25.10, 25.04, 18.95, 24.10, 16.09, 17.03, 20.97, 23.95, 14.93, 15.13, 17.87, 20.90, 16.98, 25.07, 23.01, 22.86, 17.09, 24.02…
$ caloriesBurned_per30          <dbl> 342.58, 357.16, 359.63, 351.65, 329.36, 374.56, 328.94, 363.56, 349.51, 326.31, 356.20, 361.13, 357.96, 338.54, 356.83, 359.74, 342.47, 356.98, 332.12, 350.23,…
$ bmi_calc                      <dbl> 24.87045, 23.47971, 21.14812, 32.44983, 14.83137, 31.02847, 18.43517, 31.64214, 27.64583, 19.65625, 32.50781, 25.32605, 21.51708, 23.69740, 18.49829, 27.79255,…
$ cal_from_macros               <dbl> 2139.59, 1711.65, 1965.92, 1627.28, 2659.23, 1369.66, 2245.45, 2105.25, 1383.27, 1527.67, 2065.28, 1848.79, 1446.67, 2955.34, 1654.72, 2384.30, 1538.55, 1868.1…
$ pct_carbs                     <dbl> 0.5004323, 0.5008501, 0.5006104, 0.4995330, 0.5005810, 0.4989851, 0.4993743, 0.4988861, 0.5004952, 0.5002651, 0.5015882, 0.5001325, 0.5027270, 0.5003959, 0.500…
$ protein_per_kg                <dbl> 1.6247893, 1.5140932, 1.6634452, 0.8620175, 2.5381534, 0.6465493, 1.9234720, 1.2538361, 0.7839241, 1.5254372, 1.1893018, 1.1118131, 0.8661989, 2.5623374, 1.150…
$ pct_hrr                       <dbl> 0.7412365, 0.5512471, 0.5745336, 0.7441547, 0.6684048, 0.5995814, 0.6540161, 0.6763325, 0.7964871, 0.6679490, 0.8280446, 0.7405355, 0.9548347, 0.5989914, 0.724…
$ pct_maxhr                     <dbl> 0.8359847, 0.7342696, 0.7081239, 0.8111500, 0.7897510, 0.7398595, 0.7626522, 0.7674988, 0.8715352, 0.7672579, 0.8898832, 0.8433885, 0.9709928, 0.7161863, 0.835…
$ cal_balance                   <dbl> 725.10, -232.91, 805.74, 1206.21, 303.60, 2313.67, -86.90, 1463.19, 524.63, 89.75, 501.74, -501.40, -131.62, -619.20, 1302.15, 1161.16, -449.58, 860.40, 998.64…
$ lean_mass_kg                  <dbl> 47.77739, 40.80980, 44.63558, 63.00743, 43.34750, 71.38246, 46.40891, 57.09347, 64.33809, 39.29520, 61.26092, 64.05059, 62.71514, 42.33299, 54.21741, 68.43891,…
$ expected_burn                 <dbl> 685.1600, 978.6184, 654.5266, 773.6300, 711.4176, 516.8928, 1098.6596, 734.3912, 1230.2752, 763.5654, 1203.9560, 1379.5166, 1353.0888, 1110.4112, 535.2450, 863…
$ calories_burned_per_30_min_bc <dbl> 7.26e+19, 1.02e+20, 1.08e+20, 8.99e+19, 5.26e+19, 1.51e+20, 5.21e+19, 1.18e+20, 8.55e+19, 4.88e+19, 9.98e+19, 1.12e+20, 1.04e+20, 6.59e+19, 1.01e+20, 1.08e+20,…
skimr::skim(life_clean)
── Data Summary ────────────────────────
                           Values    
Name                       life_clean
Number of rows             20000     
Number of columns          38        
_______________________              
Column type frequency:               
  numeric                  38        
________________________             
Group variables            None      
# looking at calories_burned as the y variable
# calories_burned: total calories burned during the session

summary(life_clean$calories_burned)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  323.1   910.8  1231.5  1280.1  1553.1  2890.8 
ggplot(life_clean, aes(x = calories_burned)) +
  geom_histogram(bins = 30, color = "purple", fill = "lightblue4")


# looking at a right skewed distribution with a mean about 1280 total calories burned

ggplot(life_clean, aes(x = calories_burned)) +
  geom_boxplot(fill = "steelblue")


# boxplot shows some outliers on the higher calorie burn end
# looking at burns_calories_per_30min as the y variable
# burns_calories_per_30min: estimated calories burned in 30 min of "that" exercise

summary(life_clean$caloriesBurned_per30)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  128.8   337.6   348.6   344.0   360.5   381.7 
ggplot(life_clean, aes(x = caloriesBurned_per30)) +
  geom_histogram(bins = 30, color = "purple", fill = "lightblue4")


# looking at a left skewed distribution with a mean about 344 calories burned in a 30min session

ggplot(life_clean, aes(x = caloriesBurned_per30)) +
  geom_boxplot(fill = "steelblue")


# boxplot shows an even distribution of outliers on the lower calorie burn 

Explore Diet Variables

Using calories_burned for the dependent variable

ggplot(life_clean, aes(x = carbs, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = proteins, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = fats, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = calories, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = sugar_g, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = diet_type, y = calories_burned)) +
  geom_boxplot()


ggplot(life_clean, aes(x = diet_type, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")

mean(life_clean$carbs)
[1] 249.7786
mean(life_clean$proteins)
[1] 99.91829
mean(life_clean$fats)
[1] 66.61217
mean(life_clean$calories)
[1] 2024.418
mean(life_clean$sugar_g)
[1] 24.53104
mean(life_clean$cholesterol_mg)
[1] 148.4656
mean(life_clean$cal_balance)
[1] 744.3087

Explore Exercise Variables

Using calories_burned for the dependent variable

ggplot(life_clean, aes(x = max_bpm, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = resting_bpm, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = session_duration, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = workout_type, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = workout_frequency, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = sets, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = reps, y = calories_burned)) +
  geom_point() +
  geom_smooth(method = "lm")


ggplot(life_clean, aes(x = workout_type, y = calories_burned)) +
  geom_boxplot()

num_vars <- dplyr::select(data, where(is.numeric))
#num_vars <- life_clean |> select(where(is.numeric))

corr <- cor(num_vars, use = "complete.obs")

ggcorrplot::ggcorrplot(corr, lab = FALSE, hc.order = TRUE, tl.cex = 6, tl.srt = 45)

#| fig.width: 20
#| fit.height: 15


df <- life_clean   # or life_clean, or dummy, or factor

# Select only numeric columns
num_df <- dplyr::select(data, where(is.numeric))

# Convert to long format for facetting
long_df <- num_df %>% 
  pivot_longer(everything(), names_to = "variable", values_to = "value")

# Plot: one histogram per variable
options(repr.plot.width = 24, repr.plot.height = 18)
ggplot(long_df, aes(x = value)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "white") +
  facet_wrap(~ variable, scales = "free") +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 6),
    axis.text = element_text(size = 5)
  )

dummy <- read.csv("../data/clean/CleanLifeDataDummy.csv")

df1 <- dummy   # or life_clean, or dummy, or factor

# Select only numeric columns
num_df1 <- dplyr::select(data, where(is.numeric))

# Convert to long format for facetting
long_df <- num_df %>% 
  pivot_longer(everything(), names_to = "variable", values_to = "value")

# Plot: one histogram per variable
ggplot(long_df, aes(x = value)) +
  geom_histogram(fill = "steelblue", color = "white") +
  facet_wrap(~ variable, scales = "free") +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 6),
    axis.text = element_text(size = 5)
  )

exercise_vars <- c("session_duration", "reps", "sets", 
                   "resting_bpm", "avg_bpm", "max_bpm")

df %>% 
  select(any_of(exercise_vars)) %>%
  pivot_longer(everything(), names_to = "variable", values_to = "value") %>%
  ggplot(aes(x = value)) +
  geom_histogram(bins = 30, fill = "darkgreen", color = "white") +
  facet_wrap(~ variable, scales = "free") +
  theme_minimal()
Error in select(., any_of(exercise_vars)) : 
  unused argument (any_of(exercise_vars))
LS0tCnRpdGxlOiAiRGF0YSBFeHBsb3JhdGlvbiAtIENhbG9yaWVzIFByb2plY3QiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJza2ltciIpCmxpYnJhcnkoc2tpbXIpCiMgaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpCmxpYnJhcnkoamFuaXRvcikKIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikKbGlicmFyeShnZ2NvcnJwbG90KQpgYGAKCmBgYHtyfQojIGxvYWQgY2xlYW4gZmlsZQpsaWZlX2NsZWFuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL25ldy9kYXRhLmNzdiIpCgpnbGltcHNlKGxpZmVfY2xlYW4pCnNraW1yOjpza2ltKGxpZmVfY2xlYW4pCmBgYAoKYGBge3J9CiMgbG9va2luZyBhdCBjYWxvcmllc19idXJuZWQgYXMgdGhlIHkgdmFyaWFibGUKIyBjYWxvcmllc19idXJuZWQ6IHRvdGFsIGNhbG9yaWVzIGJ1cm5lZCBkdXJpbmcgdGhlIHNlc3Npb24KCnN1bW1hcnkobGlmZV9jbGVhbiRjYWxvcmllc19idXJuZWQpCgpnZ3Bsb3QobGlmZV9jbGVhbiwgYWVzKHggPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwLCBjb2xvciA9ICJwdXJwbGUiLCBmaWxsID0gImxpZ2h0Ymx1ZTQiKQoKIyBsb29raW5nIGF0IGEgcmlnaHQgc2tld2VkIGRpc3RyaWJ1dGlvbiB3aXRoIGEgbWVhbiBhYm91dCAxMjgwIHRvdGFsIGNhbG9yaWVzIGJ1cm5lZAoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gY2Fsb3JpZXNfYnVybmVkKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gInN0ZWVsYmx1ZSIpCgojIGJveHBsb3Qgc2hvd3Mgc29tZSBvdXRsaWVycyBvbiB0aGUgaGlnaGVyIGNhbG9yaWUgYnVybiBlbmQKCmBgYApgYGB7cn0KIyBsb29raW5nIGF0IGJ1cm5zX2NhbG9yaWVzX3Blcl8zMG1pbiBhcyB0aGUgeSB2YXJpYWJsZQojIGJ1cm5zX2NhbG9yaWVzX3Blcl8zMG1pbjogZXN0aW1hdGVkIGNhbG9yaWVzIGJ1cm5lZCBpbiAzMCBtaW4gb2YgInRoYXQiIGV4ZXJjaXNlCgpzdW1tYXJ5KGxpZmVfY2xlYW4kY2Fsb3JpZXNCdXJuZWRfcGVyMzApCgpnZ3Bsb3QobGlmZV9jbGVhbiwgYWVzKHggPSBjYWxvcmllc0J1cm5lZF9wZXIzMCkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzAsIGNvbG9yID0gInB1cnBsZSIsIGZpbGwgPSAibGlnaHRibHVlNCIpCgojIGxvb2tpbmcgYXQgYSBsZWZ0IHNrZXdlZCBkaXN0cmlidXRpb24gd2l0aCBhIG1lYW4gYWJvdXQgMzQ0IGNhbG9yaWVzIGJ1cm5lZCBpbiBhIDMwbWluIHNlc3Npb24KCmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IGNhbG9yaWVzQnVybmVkX3BlcjMwKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gInN0ZWVsYmx1ZSIpCgojIGJveHBsb3Qgc2hvd3MgYW4gZXZlbiBkaXN0cmlidXRpb24gb2Ygb3V0bGllcnMgb24gdGhlIGxvd2VyIGNhbG9yaWUgYnVybiAKCmBgYAoKIyBFeHBsb3JlIERpZXQgVmFyaWFibGVzClVzaW5nIGNhbG9yaWVzX2J1cm5lZCBmb3IgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQoKYGBge3J9CmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IGNhcmJzLCB5ID0gY2Fsb3JpZXNfYnVybmVkKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IHByb3RlaW5zLCB5ID0gY2Fsb3JpZXNfYnVybmVkKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IGZhdHMsIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gY2Fsb3JpZXMsIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gc3VnYXJfZywgeSA9IGNhbG9yaWVzX2J1cm5lZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpnZ3Bsb3QobGlmZV9jbGVhbiwgYWVzKHggPSBkaWV0X3R5cGUsIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9ib3hwbG90KCkKCmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IGRpZXRfdHlwZSwgeSA9IGNhbG9yaWVzX2J1cm5lZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpgYGAKCmBgYHtyfQptZWFuKGxpZmVfY2xlYW4kY2FyYnMpCm1lYW4obGlmZV9jbGVhbiRwcm90ZWlucykKbWVhbihsaWZlX2NsZWFuJGZhdHMpCm1lYW4obGlmZV9jbGVhbiRjYWxvcmllcykKbWVhbihsaWZlX2NsZWFuJHN1Z2FyX2cpCm1lYW4obGlmZV9jbGVhbiRjaG9sZXN0ZXJvbF9tZykKbWVhbihsaWZlX2NsZWFuJGNhbF9iYWxhbmNlKQoKYGBgCgojIEV4cGxvcmUgRXhlcmNpc2UgVmFyaWFibGVzClVzaW5nIGNhbG9yaWVzX2J1cm5lZCBmb3IgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQoKYGBge3J9CmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IG1heF9icG0sIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gcmVzdGluZ19icG0sIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gc2Vzc2lvbl9kdXJhdGlvbiwgeSA9IGNhbG9yaWVzX2J1cm5lZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpnZ3Bsb3QobGlmZV9jbGVhbiwgYWVzKHggPSB3b3Jrb3V0X3R5cGUsIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gd29ya291dF9mcmVxdWVuY3ksIHkgPSBjYWxvcmllc19idXJuZWQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZ2dwbG90KGxpZmVfY2xlYW4sIGFlcyh4ID0gc2V0cywgeSA9IGNhbG9yaWVzX2J1cm5lZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpnZ3Bsb3QobGlmZV9jbGVhbiwgYWVzKHggPSByZXBzLCB5ID0gY2Fsb3JpZXNfYnVybmVkKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCmdncGxvdChsaWZlX2NsZWFuLCBhZXMoeCA9IHdvcmtvdXRfdHlwZSwgeSA9IGNhbG9yaWVzX2J1cm5lZCkpICsKICBnZW9tX2JveHBsb3QoKQoKYGBgCgpgYGB7cn0KbnVtX3ZhcnMgPC0gZHBseXI6OnNlbGVjdChkYXRhLCB3aGVyZShpcy5udW1lcmljKSkKI251bV92YXJzIDwtIGxpZmVfY2xlYW4gfD4gc2VsZWN0KHdoZXJlKGlzLm51bWVyaWMpKQoKY29yciA8LSBjb3IobnVtX3ZhcnMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQoKZ2djb3JycGxvdDo6Z2djb3JycGxvdChjb3JyLCBsYWIgPSBGQUxTRSwgaGMub3JkZXIgPSBUUlVFLCB0bC5jZXggPSA2LCB0bC5zcnQgPSA0NSkKCmBgYAoKYGBge3J9CiN8IGZpZy53aWR0aDogMjAKI3wgZml0LmhlaWdodDogMTUKCgpkZiA8LSBsaWZlX2NsZWFuICAgIyBvciBsaWZlX2NsZWFuLCBvciBkdW1teSwgb3IgZmFjdG9yCgojIFNlbGVjdCBvbmx5IG51bWVyaWMgY29sdW1ucwpudW1fZGYgPC0gZHBseXI6OnNlbGVjdChkYXRhLCB3aGVyZShpcy5udW1lcmljKSkKCiMgQ29udmVydCB0byBsb25nIGZvcm1hdCBmb3IgZmFjZXR0aW5nCmxvbmdfZGYgPC0gbnVtX2RmICU+JSAKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJ2YXJpYWJsZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCgojIFBsb3Q6IG9uZSBoaXN0b2dyYW0gcGVyIHZhcmlhYmxlCmdncGxvdChsb25nX2RmLCBhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCwgZmlsbCA9ICJzdGVlbGJsdWUiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBmYWNldF93cmFwKH4gdmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkKICApCmBgYAoKYGBge3J9CmR1bW15IDwtIHJlYWQuY3N2KCIuLi9kYXRhL2NsZWFuL0NsZWFuTGlmZURhdGFEdW1teS5jc3YiKQoKZGYxIDwtIGR1bW15ICAgIyBvciBsaWZlX2NsZWFuLCBvciBkdW1teSwgb3IgZmFjdG9yCgojIFNlbGVjdCBvbmx5IG51bWVyaWMgY29sdW1ucwpudW1fZGYxIDwtIGRwbHlyOjpzZWxlY3QoZGF0YSwgd2hlcmUoaXMubnVtZXJpYykpCgojIENvbnZlcnQgdG8gbG9uZyBmb3JtYXQgZm9yIGZhY2V0dGluZwpsb25nX2RmIDwtIG51bV9kZiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAidmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKQoKIyBQbG90OiBvbmUgaGlzdG9ncmFtIHBlciB2YXJpYWJsZQpnZ3Bsb3QobG9uZ19kZiwgYWVzKHggPSB2YWx1ZSkpICsKICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gInN0ZWVsYmx1ZSIsIGNvbG9yID0gIndoaXRlIikgKwogIGZhY2V0X3dyYXAofiB2YXJpYWJsZSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQogICkKYGBgCgpgYGB7cn0KZXhlcmNpc2VfdmFycyA8LSBjKCJzZXNzaW9uX2R1cmF0aW9uIiwgInJlcHMiLCAic2V0cyIsIAogICAgICAgICAgICAgICAgICAgInJlc3RpbmdfYnBtIiwgImF2Z19icG0iLCAibWF4X2JwbSIpCgpkZiAlPiUgCiAgc2VsZWN0KGFueV9vZihleGVyY2lzZV92YXJzKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAidmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzAsIGZpbGwgPSAiZGFya2dyZWVuIiwgY29sb3IgPSAid2hpdGUiKSArCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoK